clc;        clear;      close all;
%%定义初始条件
step_size = 0.0001;   %步长                                       
simulationTime=10;     %仿真总时长
n = simulationTime/step_size;   %循环次数      
t=zeros(1,n); % 仿真时间点矩阵
Triggering_t1=zeros(1,n); %触发时刻矩阵
norm_e=zeros(1,n); %误差变量的norme
u1=zeros(1,n); % 无事件触发控制输入
u=zeros(1,n); %事件触发控制输入
x_last=zeros(2,n); %上一次触发的状态变量
x_new=zeros(2,n); % 触发之后新的状态变量

x0 = [10*cos(2*pi/30); 10*sin(2*pi/30)];           % 初始状态
A = [0 1; -2 3];  %系统参数矩阵
B = [0; 1];   %系统参数矩阵
K = [1 -4];   %反馈矩阵
y=0;%触发次数
z=0;%没有触发的次数

u(:,1)=K*x_new(:,1);
u1(:,1)=K*x_new(:,1);
x_new1(:,1) = x0;
x_last(:,1) = x0;  %初始时的x_last  上一个触发时刻的状态
x_new(:,1) = x0;   %初始时的x_new   当前状态

%%无事件触发有限差分
for i=2:n
    x_new1(:,i) = x_new1(:,i-1) + (A*x_new1(:,i-1) + B*u1(:,i-1)) * step_size;      % 差分方程
    u1(:,i) = K * x_new1(:,i);                                     % 控制输入（不触发u不变）
end
%%事件触发控制有限差分

for i=2:n
    t(i)=t(1)+(i-1)*step_size;
    x_new (:,i)= x_new(:,i-1) + (A*x_new(:,i-1) + B*u(:,i-1)) * step_size;      % 差分方程
    e(:,i) = x_last(:,i-1) - x_new(:,i);                                        % 事件误差
    norm_e(:,i) = norm(e(:,i));                                                 % 求范数

    if norm(e(:,i)) > 0.05 * norm(x_new(:,i))                                   % 触发条件
        x_last(:,i) = x_new(:,i);                                               % 更新输入保持的x值
        Triggering_t1(:,i)=t(:,i);                                              % 记录触发时刻
        z=z+1;                                                                  % 记录触发次数
     else
        y=y+1;                                                                  % 记录非触发次数
        x_last(:,i)=x_last(:,i-1);                                              % 依旧维持原来的x值
    end
        u(:,i)= K * x_last(:,i);                                                % 控制输入（不触发u不变）
end

%%结果绘图部分

figure(1);
plot(t, x_new(1,:), 'r',t, x_new(2,:),'c',t, x_new1(1,:), 'g', t, x_new1(2,:), 'black')   % 系统状态
figure;
plot(t, norm_e(1,:))                                                           % 误差

figure;
plot(t,u)          %事件触发控制